import { defineStore } from 'pinia'
import { ref } from 'vue'

// 创建 store
export const useRoleChatStore = defineStore('roleChat', () => {
    // 对话过的角色模型记录列表，默认为空
    const selectedRoleModelList = ref([])
    // 查询该角色是否对话过
    function findSelectedRoleModelList(roleId) {
        return selectedRoleModelList.value.find(roleModel => roleModel.roleId === roleId)
    }

    // 添加该角色对话过的模型
    function addSelectedRoleModelList(role) {
        // 添加该角色对话过的模型
        selectedRoleModelList.value.push(role)
        return findSelectedRoleModelList(role.roleId)
    }

    // 修改该角色的文本模型
    function updateSelectedRoleTextModel(roleId, textModel) {
        // 查询该角色存储在本地的模型信息
        const index = selectedRoleModelList.value.findIndex(role => role.roleId === roleId)
        // 如果该角色存在，则修改该角色的文本模型
        if (index !== -1) {
            // 使用 patch，保证响应式
            selectedRoleModelList.value[index] = {
                ...selectedRoleModelList.value[index],
                textModel
            }
        }
    }

    // 修改该角色的语音模型
    function updateSelectedRoleSoundModel(roleId, soundModel) {
        // 查询该角色存储在本地的模型信息
        const index = selectedRoleModelList.value.findIndex(role => role.roleId === roleId)
        // 如果该角色存在，则修改该角色的语音模型
        if (index !== -1) {
            // 角色的语音模型
            const roleSoundModel = selectedRoleModelList.value[index].soundModel

            // 如果该角色的语音模型存在，则修改该角色的语音模型
            if (roleSoundModel) {
                // 获取语音模型里的 language 对象
                const language = roleSoundModel.language

                // ⛔ 从soundModel中排除 languages
                const { languages, ...rest } = soundModel

                // 合并 rest 与 language 到 soundModel
                selectedRoleModelList.value[index] = {
                    ...selectedRoleModelList.value[index],
                    soundModel: {
                        ...rest,
                        language
                    }
                }
            }
            // 该角色的语音模型不存在, 可以直接覆盖, 在接收角色的语音模型时，必须处理好参数再传入
            else {
                selectedRoleModelList.value[index] = {
                    ...selectedRoleModelList.value[index],
                    soundModel
                }
            }
        }
    }

    // 更新角色的语音模型里的语言
    function updateSelectedSoundModelLanguage(roleId, language) {
        // 查询该角色存储在本地的模型信息
        const index = selectedRoleModelList.value.findIndex(role => role.roleId === roleId);

        // 如果该角色存在，则修改该角色的语音模型里的语言
        if (index !== -1) {
            // 获取该角色的语音模型
            const soundModel = selectedRoleModelList.value[index].soundModel

            // 修改该角色的语音模型里的语言
            selectedRoleModelList.value[index] = {
                ...selectedRoleModelList.value[index],
                soundModel: {
                    ...soundModel,
                    language
                }
            }
        }
    }

    // 删除该角色存储在本地的模型信息
    function deleteSelectedRoleModel(roleId) {
        // 从 selectedRoleModelList 数组中删除对应的对话
        const index = selectedRoleModelList.value.findIndex(role => role.roleId === roleId);
        if (index !== -1) {
            selectedRoleModelList.value.splice(index, 1);
        }
    }

    // 对外暴露相关变量与方法
    return { selectedRoleModelList, findSelectedRoleModelList, addSelectedRoleModelList, updateSelectedRoleTextModel, updateSelectedRoleSoundModel, deleteSelectedRoleModel, updateSelectedSoundModelLanguage }
},
{
    // 开启持久化
    persist: true
})
